// 文件API调用封装
import axios from 'axios'

// 创建axios实例
const api = axios.create({
  baseURL: '/api',
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
api.interceptors.request.use(
  config => {
    console.log('API请求:', config.method?.toUpperCase(), config.url, config.params || config.data)
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  response => {
    console.log('API响应:', response.status, response.config.url)
    return response.data
  },
  error => {
    console.error('响应错误:', error.response?.status, error.message)
    
    // 统一错误处理
    let message = '网络请求失败'
    
    if (error.response) {
      switch (error.response.status) {
        case 400:
          message = '请求参数错误'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = error.response.data?.message || '请求失败'
      }
    } else if (error.code === 'ECONNABORTED') {
      message = '请求超时，请检查网络连接'
    } else if (error.code === 'NETWORK_ERROR') {
      message = '网络连接失败，请检查服务器状态'
    }
    
    return Promise.reject(new Error(message))
  }
)

/**
 * 文件API接口
 */
export const fileApi = {
  /**
   * 获取文件索引
   * @returns {Promise} 文件索引数据
   */
  async getFileIndex() {
    try {
      const response = await api.get('/index')
      return response
    } catch (error) {
      console.error('获取文件索引失败:', error.message)
      throw error
    }
  },

  /**
   * 开始文件扫描
   * @param {Object} options 扫描选项
   * @param {string} options.path 扫描路径
   * @param {boolean} options.force 是否强制重新扫描
   * @returns {Promise} 扫描任务信息
   */
  async startScan(options = {}) {
    try {
      const response = await api.post('/scan', {
        path: options.path,
        force: options.force || false
      })
      return response
    } catch (error) {
      console.error('启动文件扫描失败:', error.message)
      throw error
    }
  },

  /**
   * 获取扫描状态
   * @param {string} scanId 扫描任务ID
   * @returns {Promise} 扫描状态信息
   */
  async getScanStatus(scanId = '') {
    try {
      const url = scanId ? `/scan/status/${scanId}` : '/scan/status'
      const response = await api.get(url)
      return response
    } catch (error) {
      console.error('获取扫描状态失败:', error.message)
      throw error
    }
  },

  /**
   * 停止文件扫描
   * @returns {Promise} 停止结果
   */
  async stopScan() {
    try {
      const response = await api.post('/scan/stop')
      return response
    } catch (error) {
      console.error('停止文件扫描失败:', error.message)
      throw error
    }
  },

  /**
   * 获取扫描日志
   * @param {Object} options 日志选项
   * @param {number} options.lines 获取的行数，默认100
   * @param {string} options.level 日志级别 error|warn|info
   * @returns {Promise} 日志数据
   */
  async getScanLogs(options = {}) {
    try {
      const params = {
        lines: options.lines || 100,
        level: options.level || 'error'
      }
      const response = await api.get('/scan/logs', { params })
      return response
    } catch (error) {
      console.error('获取扫描日志失败:', error.message)
      throw error
    }
  },

  /**
   * 搜索文件
   * @param {Object} params 搜索参数
   * @param {string} params.keyword 搜索关键词
   * @param {string} params.type 文件类型
   * @param {string} params.searchType 搜索类型 (name/path/all)
   * @param {number} params.limit 结果数量限制
   * @returns {Promise} 搜索结果
   */
  async searchFiles(params) {
    try {
      const response = await api.get('/search', { params })
      return response
    } catch (error) {
      console.error('搜索文件失败:', error.message)
      throw error
    }
  },

  /**
   * 刷新索引
   * @returns {Promise} 刷新结果
   */
  async refreshIndex() {
    try {
      const response = await api.post('/refresh')
      return response
    } catch (error) {
      console.error('刷新索引失败:', error.message)
      throw error
    }
  },

  /**
   * 获取系统状态
   * @returns {Promise} 系统状态信息
   */
  async getSystemStatus() {
    try {
      const response = await api.get('/status')
      return response
    } catch (error) {
      console.error('获取系统状态失败:', error.message)
      throw error
    }
  },

  /**
   * 获取配置信息
   * @returns {Promise} 配置信息
   */
  async getConfig() {
    try {
      const response = await api.get('/config')
      return response
    } catch (error) {
      console.error('获取配置信息失败:', error.message)
      throw error
    }
  },

  /**
   * 获取文件信息
   * @param {string} fileId 文件ID
   * @returns {Promise} 文件信息
   */
  async getFileInfo(fileId) {
    try {
      const response = await api.get(`/file/info/${fileId}`)
      return response
    } catch (error) {
      console.error('获取文件信息失败:', error.message)
      throw error
    }
  },

  /**
   * 获取文件下载链接
   * @param {string} fileId 文件ID
   * @returns {string} 下载链接
   */
  getDownloadUrl(fileId) {
    return `/api/file/download/${fileId}`
  },

  /**
   * 获取文件预览链接
   * @param {string} fileId 文件ID
   * @returns {string} 预览链接
   */
  getPreviewUrl(fileId) {
    return `/api/file/preview/${fileId}`
  },

  /**
   * 下载文件
   * @param {string} fileId 文件ID
   * @param {string} fileName 文件名
   */
  downloadFile(fileId, fileName) {
    const downloadUrl = this.getDownloadUrl(fileId)

    // 规范化文件名，避免浏览器因特殊字符拒绝下载
    const safeName = (fileName || 'download')
      .replace(/[\\/:*?"<>|]/g, '_')
      .replace(/\s+/g, ' ')

    try {
      const link = document.createElement('a')
      link.href = downloadUrl
      link.download = safeName
      link.target = '_blank' // 一些浏览器对 programmatic download 更宽松
      link.rel = 'noopener'
      link.style.display = 'none'
      document.body.appendChild(link)
      link.click()
      setTimeout(() => document.body.removeChild(link), 0)
    } catch (e) {
      // 兜底：直接跳转到下载地址
      window.location.href = downloadUrl
    }
  },

  /**
   * 预览文件（在新窗口中打开）
   * @param {string} fileId 文件ID
   */
  previewFile(fileId) {
    const previewUrl = this.getPreviewUrl(fileId)
    window.open(previewUrl, '_blank')
  }
}

export default api